package top.andoudou.generator.screw;

import cn.smallbun.screw.core.Configuration;
import cn.smallbun.screw.core.engine.EngineConfig;
import cn.smallbun.screw.core.engine.EngineFileType;
import cn.smallbun.screw.core.engine.EngineTemplateType;
import cn.smallbun.screw.core.execute.DocumentationExecute;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import top.andoudou.generator.screw.entity.MysqlDBDocumentInfo;

import javax.sql.DataSource;

/**
 * @Description  数据库文档生成
 * @Date 2021/8/5
 * @Author 傻男人
 */
public class ScrewTool  {

    public static void main(String[] args) {
        MysqlDBDocumentInfo info = new MysqlDBDocumentInfo();
        info.setDbUrl("jdbc:mysql://172.16.10.150:13063/process?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true");
        info.setDbUserName("root");
        info.setDbPassword("Xhcf@4574QWa");
        info.setFileOutputDir("D:\\gen4");
        info.setFileOutputType(EngineFileType.MD);
        info.setDocFileName("车贷数据库文档");
        info.setDocVersion("1.0.0");
        info.setDocDescription("车贷数据库文档");
        info.setDriverClassName("com.mysql.cj.jdbc.Driver");
        executeDBDocument(info);
    }

    /**
     * 生成数据库文档
     * @param info
     */
    public static void executeDBDocument(MysqlDBDocumentInfo info){
        // 创建 screw 的配置
        Configuration config = Configuration.builder()
                // 版本
                .version(info.getDocVersion())
                // 描述
                .description(info.getDocDescription())
                // 数据源
                .dataSource(buildDataSource(info))
                // 引擎配置
                .engineConfig(buildEngineConfig(info))
                // 处理配置
                .produceConfig(info.getProcessConfig())
                .build();
        // 执行 screw，生成数据库文档
        new DocumentationExecute(config).execute();
    }

    /**
     * 创建数据源
     */
    private static DataSource buildDataSource(MysqlDBDocumentInfo info) {
        // 创建 HikariConfig 配置类
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName(info.getDriverClassName());
        hikariConfig.setJdbcUrl(info.getDbUrl());
        hikariConfig.setUsername(info.getDbUserName());
        hikariConfig.setPassword(info.getDbPassword());
        // 设置可以获取 tables remarks 信息
        hikariConfig.addDataSourceProperty("useInformationSchema", "true");
        // 创建数据源
        return new HikariDataSource(hikariConfig);
    }

    /**
     * 创建 screw 的引擎配置
     * @param info
     * @return
     */
    private static EngineConfig buildEngineConfig(MysqlDBDocumentInfo info) {
        return EngineConfig.builder()
                // 生成文件路径
                .fileOutputDir(info.getFileOutputDir())
                // 打开目录
                .openOutputDir(false)
                // 文件类型
                .fileType(info.getFileOutputType())
                // 文件类型
                .produceType(EngineTemplateType.freemarker)
                // 自定义文件名称
                .fileName(info.getDocFileName())
                .build();
    }

}
